package com.vhall.component.service.interactive.assembler;

import com.vhall.component.entity.interactive.dto.QuestionAnswerNumberCacheDTO;
import com.vhall.component.entity.interactive.dto.QuestionAnswerRefCacheDTO;
import com.vhall.component.entity.interactive.vo.QuestionCountVo;
import com.vhall.component.entity.interactive.vo.QuestionListDTO;
import com.vhall.component.entity.interactive.vo.QuestionListRspVO;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 问卷类实体对象间转换
 *
 * @author yuanzh
 */
@Mapper(componentModel = "spring")
public interface QuestionAssembler {

    /**
     * 转换问卷对象为响应对象
     *
     * @param dto         观看端问卷对象
     * @param roomSubject 房间主题
     * @return 响应对象
     */
    @Mapping(target = "roomSubject", expression = "java( roomSubject )")
    QuestionListRspVO convertTo(QuestionListDTO dto, @Context String roomSubject);

    /**
     * 转换问卷列表为响应列表
     *
     * @param list 观看端问卷列表
     * @return 返回响应列表
     */
    List<QuestionListRspVO> convertTos(List<QuestionListDTO> list);

    /**
     * 转换问卷列表为响应列表
     *
     * @param dtoList     观看端问卷列表
     * @param roomSubject 房间主题
     * @return 返回响应列表
     */
    default List<QuestionListRspVO> convertTos(List<QuestionListDTO> dtoList, @Context String roomSubject) {
        if (dtoList == null) {
            return Collections.emptyList();
        }
        ArrayList<QuestionListRspVO> list = new ArrayList<>(dtoList.size());
        for (QuestionListDTO dto : dtoList) {
            list.add(convertTo(dto, roomSubject));
        }
        return list;
    }

    /**
     * 问卷统计转为问卷回答次数缓存对象
     *
     * @param countVo 问卷统计
     * @return 问卷回答次数缓存对象
     */
    @Mapping(source = "count", target = "answerNumber")
    QuestionAnswerNumberCacheDTO convertToAnswerNumberCache(QuestionCountVo countVo);

    /**
     * 问卷统计列表转为问卷回答次数缓存列表
     *
     * @param countVos 问卷填写次数统计列表
     * @return 问卷回答次数缓存列表
     */
    List<QuestionAnswerNumberCacheDTO> convertToAnswerNumberCaches(List<QuestionCountVo> countVos);

    /**
     * 问卷统计转为问卷回答关联缓存对象
     *
     * @param countVo 问卷统计
     * @return 问卷回答次数缓存对象
     */
    QuestionAnswerRefCacheDTO convertToQuestionAnswerRefCache(QuestionCountVo countVo);

    /**
     * 问卷统计列表转为问卷回答关联缓存列表
     *
     * @param countVos 问卷统计列表
     * @return 问卷回答缓存列表
     */
    List<QuestionAnswerRefCacheDTO> convertToQuestionAnswerRefCaches(List<QuestionCountVo> countVos);

    /**
     * 问卷回答次数缓存转为问卷统计
     *
     * @param cacheDTO 缓存对象
     * @return 问卷统计对象
     */
    @Mapping(source = "answerNumber", target = "count")
    QuestionCountVo convertTo(QuestionAnswerNumberCacheDTO cacheDTO);

    /**
     * 问卷回答次数缓存列表转为问卷统计列表
     *
     * @param cacheList 问卷统计列表
     * @return 问卷统计列表
     */
    List<QuestionCountVo> convertQuestionAnswerNumberCacheTo(List<QuestionAnswerNumberCacheDTO> cacheList);

    /**
     * 问卷回答关联缓存对象转为问卷统计
     *
     * @param cacheDTO 缓存对象
     * @return 问卷统计对象
     */
    QuestionCountVo convertTo(QuestionAnswerRefCacheDTO cacheDTO);

    /**
     * 问卷回答关联缓存列表转为问卷统计列表
     *
     * @param cacheList 问卷统计列表
     * @return 问卷统计列表
     */
    List<QuestionCountVo> convertQuestionAnswerCacheTo(List<QuestionAnswerRefCacheDTO> cacheList);

}
